package br.com.gip.controller;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import org.richfaces.component.html.HtmlDataTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.gip.business.PerfilAcessoBusiness;
import br.com.gip.business.ProjetoBusiness;
import br.com.gip.constant.Status;
import br.com.gip.exception.BusinessException;
import br.com.gip.repository.model.PerfilAcesso;
import br.com.gip.repository.model.Projeto;

@Scope("session")
@Controller("projetoController")
public class ProjetoController implements Serializable {

	private static final long serialVersionUID = 5488936666805646739L;
	
	@Autowired
	private ProjetoBusiness projetoBusiness;
	
	@Autowired
	private PerfilAcessoBusiness perfilAcessoBusiness;
	
	@Autowired
	private LoginController loginContoller;
	
	private List<Projeto> projetos;
	
	private Projeto projeto;
	
	private HtmlDataTable dataTable;
	
	private String duracaoTemp;
	
	private Boolean naoExibirCadastrar;

	private Boolean naoExibirAlterar;
	
	private String message;
	
	public String cadastro() {
		this.projeto = new Projeto();
		this.duracaoTemp = "";
		this.naoExibirCadastrar = Boolean.FALSE;
		this.naoExibirAlterar = Boolean.TRUE;
		this.message = "";
		return "cadastro-projeto";
	}
	
	public String lista() {
		this.message = "";
		this.projeto = new Projeto();
		this.projetos = new ArrayList<Projeto>();
		return "lista-projeto";
	}
	
	public String buscarProjetos() {
		this.message = "";		
		this.projetos = this.projetoBusiness.buscarProjetos(this.projeto.getNome(), this.projeto.getStatusProjeto());
		return "lista-projetos";
	}

	public String editarProjeto() {
		this.projeto = (Projeto) this.dataTable.getRowData();
		this.duracaoTemp = this.projeto.getDisplayDuracao();
		this.naoExibirCadastrar = Boolean.TRUE;
		this.naoExibirAlterar = Boolean.FALSE;
		this.message = "";
		return "editar-projeto";
	}
	
	public String cadastrarProjeto() {
		String foward = "cadatro-projeto-sucesso";
		
		if (naoExibirAlterar) {
			this.projeto.setDataCriacao(new Date());
		}
		
		Date dataTermino = new Date();

		try {
			dataTermino = new SimpleDateFormat("dd/MM/yyyy").parse(this.duracaoTemp);
		} catch (ParseException e) { /* ignoring expetion */ } 
		
		this.projeto.setDuracao(dataTermino);
		this.projeto.setOwner(loginContoller.getUsuario());
		
		try {
			this.projetoBusiness.salvarProjeto(this.projeto);
		} catch (BusinessException e) {
			this.message = e.getMessage();
			return "cadastro-projeto-erro";
		}
		
		this.projetos = this.projetoBusiness.buscarProjetos();
		this.projeto = new Projeto();
		
		this.message = "Projeto salvo com sucesso";
		
		return foward;
	}
	
	public SelectItem[] getAllStatus() {
		List<SelectItem> itens = new ArrayList<SelectItem>();
		
		itens.add(new SelectItem(null, "Selecione"));
		for (Status status : Status.values()) {
			itens.add(new SelectItem(status.name(), status.getDescricao()));
		}

		return itens.toArray(new SelectItem[itens.size()]);
	}
	
	/*inclusão para buscar lista de Perfis*/
	
	public SelectItem[] getAllPerfis() {
		List<SelectItem> itens = new ArrayList<SelectItem>();
		
		itens.add(new SelectItem("","Selecione"));
		for (PerfilAcesso perfilacessos : this.perfilAcessoBusiness.buscarPerfilAcesso()) {
			itens.add(new SelectItem(perfilacessos.getPerfilAcessoId(), perfilacessos.getPerfil()));
		}

		return itens.toArray(new SelectItem[itens.size()]);
				
	}
	
	public List<Projeto> getProjetos() {
		return projetos;
	}

	public Projeto getProjeto() {
		return projeto;
	}

	public void setProjeto(Projeto projeto) {
		this.projeto = projeto;
	}

	public HtmlDataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(HtmlDataTable dataTable) {
		this.dataTable = dataTable;
	}

	public ProjetoBusiness getProjetoBusiness() {
		return projetoBusiness;
	}

	public void setProjetoBusiness(ProjetoBusiness projetoBusiness) {
		this.projetoBusiness = projetoBusiness;
	}

	public PerfilAcessoBusiness getPerfilAcessoBusiness() {
		return perfilAcessoBusiness;
	}

	public void setPerfilAcessoBusiness(PerfilAcessoBusiness perfilAcessoBusiness) {
		this.perfilAcessoBusiness = perfilAcessoBusiness;
	}

	public LoginController getLoginContoller() {
		return loginContoller;
	}

	public void setLoginContoller(LoginController loginContoller) {
		this.loginContoller = loginContoller;
	}

	public void setProjetos(List<Projeto> projetos) {
		this.projetos = projetos;
	}

	public String getDuracaoTemp() {
		return duracaoTemp;
	}

	public void setDuracaoTemp(String duracaoTemp) {
		this.duracaoTemp = duracaoTemp;
	}

	public Boolean getNaoExibirCadastrar() {
		return naoExibirCadastrar;
	}

	public void setNaoExibirCadastrar(Boolean naoExibirCadastrar) {
		this.naoExibirCadastrar = naoExibirCadastrar;
	}

	public Boolean getNaoExibirAlterar() {
		return naoExibirAlterar;
	}

	public void setNaoExibirAlterar(Boolean naoExibirAlterar) {
		this.naoExibirAlterar = naoExibirAlterar;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}
